package negocio;

import java.util.ArrayList;
import java.util.Collection;



import org.orm.PersistentException;
import org.orm.PersistentTransaction;

import orm.tallerdesoa.Tcp_persona;

import SOAPVO.PersonaSOAPVO;



/**
 * 
 * @author
 */
public class PersonaSOA {
	private static final int ROW_COUNT = 100;

	/**
	 * 
	 * @param rut, cuerpo del rut de una persona.
	 * @param verificador, digito verificador de dicho rut.
	 * @param nombre, nombre de persona.
	 * @return message, devuelve el resultado de la operacion que se realizo.
	 */
	public static  String add( String rut,  String verificador,	 String nombre,  String sexo) {

		String message = "";
		String resultado;
		int resultado2 = 1;

		// verifica si los campos solicitados vienen vacios.
		if ((rut == null) || (rut.equals("")) || (verificador == null)
				|| (verificador.equals("")) || (nombre == null)
				|| (nombre.equals("")) || (sexo == null) || (sexo.equals(""))) {
			message = rut + " " + verificador + " " + sexo + " " + nombre
					+ "\n";
			message += "Ingrese todos los datos de la persona (rut, digito verificador, nombre y sexo)";
			resultado2 = 0;
		}
		// si no vienen vacios.
		else {
			// valida si el cuerpo del rut viene con el numero de caracteres
			// correctos.
			if (rut.length() != 8) {

				message = "el largo del rut no corresponde";
				resultado2 = 0;
			}

			int v = Integer.parseInt(verificador);
			// valida que el digito verificador tenga un valor correcto.
			if (v > 9) {

				message = "el digito verificador no es correcto";
				resultado2 = 0;
			}

		}// fin else si los valores no vienen vacios

		// si pasa todas las validaciones...
		if (resultado2 == 1) {

			char veri = verificador.charAt(0);

			// Instancia factory
			orm.tallerdesoa.DAOFactory lDAOFactory = orm.tallerdesoa.DAOFactory.getDAOFactory();
			// Instancia DAO
			orm.tallerdesoa.dao.Tcp_personaDAO lormTcp_personaDAO = lDAOFactory
					.getTcp_personaDAO();
			// Instancia objeto orm (vo)
			orm.tallerdesoa.Tcp_persona lormTcp_persona = lormTcp_personaDAO.createTcp_persona();

			// Set objeto orm
			lormTcp_persona.setPers_rut(rut);
			lormTcp_persona.setPers_dverificador(veri+"");
			lormTcp_persona.setPers_nombre(nombre);
			lormTcp_persona.setPers_sexo(sexo);

			try {
				// Metodo save de DAO
				lormTcp_personaDAO.save(lormTcp_persona);// guarda a una nueva
															// persona
				resultado = lormTcp_persona.getPers_nombre();
			} catch (PersistentException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
				resultado = "<FAIL>";
			}

			message = resultado + "\n ha sido agregado(a)";
		}
		return message;

	}

	/**
	 * Metodo que sirve para borrar un registro en la BD segun sea su rut.
	 * 
	 * @param rut
	 *            , rut de la persona que se desea borrar.
	 * @return message, resultado de la operacion.
	 */
	
	public static String borrar(String rut) {

		String message = "";
		PersistentTransaction t;
		int resultado = 1;

		// valida si los campos solicitados vienen vacios.
		if ((rut == null) || (rut.equals(""))) {

			message = "debe ingresar el rut de la persona a borrar, en el campo correspondiente al rut";
			resultado = 0;
		}
		// si no vienen vacios.
		else {
			// valida el largo del cuerpo del rut.
			if (rut.length() != 8) {

				message = "el largo del rut no corresponde";
				resultado = 0;

			}// si el largo no corresponde

		}
		// si pasa todas las validaciones.
		if (resultado == 1) {

			try {

				t = orm.tallerdesoa.TallerdeSOAPersistentManager.instance().getSession()
						.beginTransaction();

				orm.tallerdesoa.DAOFactory lDAOFactory = orm.tallerdesoa.DAOFactory.getDAOFactory();
				orm.tallerdesoa.dao.Tcp_personaDAO lormTcp_personaDAO = lDAOFactory
						.getTcp_personaDAO();

				orm.tallerdesoa.Tcp_persona[] ormPersonas;
				// busqueda del rut en la BD
				ormPersonas = lDAOFactory.getTcp_personaDAO()
						.listTcp_personaByQuery("pers_rut='" + rut + "'", null);
				int length2 = ormPersonas.length;
				// si no se encuentran registros para el rut.
				if (length2 == 0) {

					message = "ERROR: No se ha encontrado registros del rut ingresado";
				}
				// si se encuentran registros para el rut
				else {
					orm.tallerdesoa.Tcp_persona lormTcp_persona = lormTcp_personaDAO
							.loadTcp_personaByQuery("pers_rut=" + rut, null);
					// se borra el registro.
					lormTcp_personaDAO.delete(lormTcp_persona);
					message = " ha sido eliminado(a) la persona de rut \n"
							+ rut;
				}

				t.commit();

			} catch (PersistentException e1) {
				// TODO Auto-generated catch block
				message = " error";
				// t.rollback();
				e1.printStackTrace();

			}

		}

		return message;
	}


	public static int[] graficar() {

		String message = "";
		PersistentTransaction t;
		String Femenino = "Femenino";
		String Masculino = "Masculino";
		int length = 0;
		int length2 = 0;
		int A[] = new int[2];

		try {
			t = orm.tallerdesoa.TallerdeSOAPersistentManager.instance().getSession()
					.beginTransaction();
			orm.tallerdesoa.DAOFactory lDAOFactory = orm.tallerdesoa.DAOFactory.getDAOFactory();
			System.out.println("Listing Tcp_persona...");
			// cuento cuantas mujeres hay
			orm.tallerdesoa.Tcp_persona[] ormTcp_personas = lDAOFactory.getTcp_personaDAO()
					.listTcp_personaByQuery("sexo='" + Femenino + "'", null);
			length = Math.min(ormTcp_personas.length, ROW_COUNT);

			// cuento cuantos hombre hay
			orm.tallerdesoa.Tcp_persona[] ormTcp_personas2 = lDAOFactory
					.getTcp_personaDAO().listTcp_personaByQuery(
							"sexo='" + Masculino + "'", null);
			length2 = Math.min(ormTcp_personas2.length, ROW_COUNT);

			A[0] = length;

			A[1] = length2;
			t.commit();
		}

		catch (PersistentException e1) {
			// TODO Auto-generated catch block
			message = " error";
			// t.rollback();
			e1.printStackTrace();

		}

		return A;
	}

	/**
	 * Metodo que hace una busqueda de un registro en la BD, segun su nombre o
	 * rut.
	 * 
	 * @param buscar
	 *            , parametro que sirve para realizar la busquedadel registro ya
	 *            sea nombre o rut de persona.
	 * @return message,devuelve el resultado de la operacion.
	 */
	
	public static String find(String buscar) {

		String message = "";
		PersistentTransaction t;

		// valida que los campos solicitados no vengan vacios.
		if ((buscar == null) || (buscar.equals(""))) {

			message = "debe ingresar el rut o el nombre de la persona a buscar, en el campo correspondiente al rut";

		}

		// si no vienen vacios...
		else {

			try {
				t = orm.tallerdesoa.TallerdeSOAPersistentManager.instance().getSession()
						.beginTransaction();
				orm.tallerdesoa.DAOFactory lDAOFactory = orm.tallerdesoa.DAOFactory.getDAOFactory();
				System.out.println("Listing Tcp_persona...");
				// consulta para buscar el registro segun su rut
				orm.tallerdesoa.Tcp_persona[] ormTcp_personas = lDAOFactory
						.getTcp_personaDAO().listTcp_personaByQuery(
								"pers_rut='" + buscar + "'", null);
				int length = Math.min(ormTcp_personas.length, ROW_COUNT);
				int length2 = 0;

				// si se encuentra el registro segun su rut se imprimen los
				// resultados.
				if (length >= 1) {
					for (int i = 0; i < length; i++) {
						System.out.println(ormTcp_personas[i]);
					}

					System.out.println(length + " record(s) retrieved.");

					message = "Los registros encontrados para el rut \n"
							+ buscar + "\n son \n" + length;

				}
				// si no se encuentran segun el rut, se busca por el nombre...
				else {
					// busqueda del registro segun su nombre
					ormTcp_personas = lDAOFactory.getTcp_personaDAO()
							.listTcp_personaByQuery(
									"pers_nombre='" + buscar + "'", null);
					length2 = Math.min(ormTcp_personas.length, ROW_COUNT);
					// si encuentra registro se dan a conocer los resultados.
					if (length2 >= 1) {
						for (int i = 0; i < length2; i++) {
							System.out.println(ormTcp_personas[i]);
						}

						System.out.println(length2 + " record(s) retrieved.");

						message = "Los registros encontrados para el nombre \n"
								+ buscar + "\n son \n" + length2;

					}
					// si no encuentra por el nombre se desplega mensaje de
					// resultados negativos sobre la busqueda.
					if (length2 == 0) {

						message = "no se han encontrado registros para los datos ingresados";
					}
				}

				t.commit();
			}

			catch (PersistentException e1) {
				// TODO Auto-generated catch block
				message = " error";
				// t.rollback();
				e1.printStackTrace();

			}

		}

		return message;
	}

	/**
	 * Metodo que sirve para actualizar el nombre de una persona, segun sea su
	 * rut.
	 * 
	 * @param nombre_o_rut
	 *            , parametro que solicita el nombre o el rut de la persona que
	 *            se desea actualizar.
	 * @param new_nom
	 *            , campo donde debe ir el nuevo nombre.
	 * @return
	 */
	
	public static String update(String nombre_o_rut,
			 int campo,
			 String new_nom) {

		PersistentTransaction t;
		String message = "";
		int length2 = 0;

		// valida que los campos solicitados no vengan vacios.
		if ((nombre_o_rut == null) || (nombre_o_rut.equals(""))
				|| (new_nom.equals("")) || (new_nom == null)) {
			message = "nombre_o_rut " + nombre_o_rut + " new_nom " + new_nom
					+ " campo " + campo;
			message += "ERROR: Existen campos vacíos";
		}
		// si no vienen vacios se inicia el proceso.
		else {

			try {
				t = orm.tallerdesoa.TallerdeSOAPersistentManager.instance().getSession()
						.beginTransaction();
				orm.tallerdesoa.DAOFactory lDAOFactory = orm.tallerdesoa.DAOFactory.getDAOFactory();
				orm.tallerdesoa.dao.Tcp_personaDAO lormTcp_personaDAO = lDAOFactory
						.getTcp_personaDAO();
				// se busca el registro segun su rut.
				orm.tallerdesoa.Tcp_persona[] ormTcp_personas = lDAOFactory
						.getTcp_personaDAO().listTcp_personaByQuery(
								"pers_rut='" + nombre_o_rut + "'", null);
				int length = Math.min(ormTcp_personas.length, ROW_COUNT);
				// si se encuentra registro se procede a actualizar el nombre
				if (length >= 1) {

					orm.tallerdesoa.Tcp_persona lormTcp_persona = lormTcp_personaDAO
							.loadTcp_personaByQuery("pers_rut='" + nombre_o_rut
									+ "'", null);
					if (campo == 0) {

						lormTcp_persona.setPers_nombre(new_nom);
						lormTcp_personaDAO.save(lormTcp_persona);
						message = "El nombre del rut \n" + nombre_o_rut
								+ "\n ha sido correctamente actualizado a \n"
								+ new_nom;
					}

					if (campo == 1) {

						lormTcp_persona.setPers_rut(new_nom);
						lormTcp_personaDAO.save(lormTcp_persona);
						message = "El rut \n" + nombre_o_rut
								+ "\n ha sido correctamente actualizado a \n"
								+ new_nom;
					}

					if (campo == 2) {

						char veri = new_nom.charAt(0);

						lormTcp_persona.setPers_dverificador(veri+"");
						lormTcp_personaDAO.save(lormTcp_persona);
						message = "El dígito verificador del rut \n"
								+ nombre_o_rut
								+ "\n ha sido correctamente actualizado a \n"
								+ new_nom;
					}

					if (campo == 3) {

						lormTcp_persona.setPers_sexo(new_nom);
						lormTcp_personaDAO.save(lormTcp_persona);
						message = "El sexo del rut \n" + nombre_o_rut
								+ "\n ha sido correctamente actualizado a \n"
								+ new_nom;
					}

				}
				// si no encuentra segun el rut se produce la busqueda segun
				// nombre.
				else {
					ormTcp_personas = lDAOFactory.getTcp_personaDAO()
							.listTcp_personaByQuery(
									"pers_nombre='" + nombre_o_rut + "'", null);

					length2 = Math.min(ormTcp_personas.length, ROW_COUNT);
					// si encuentra registro, actualiza el nombre para este.
					if (length2 >= 1) {

						orm.tallerdesoa.Tcp_persona lormTcp_persona = lormTcp_personaDAO
								.loadTcp_personaByQuery("pers_nombre='"
										+ nombre_o_rut + "'", null);

						if (campo == 0) {

							lormTcp_persona.setPers_nombre(new_nom);
							lormTcp_personaDAO.save(lormTcp_persona);
							message = "El nombre del rut \n"
									+ nombre_o_rut
									+ "\n ha sido correctamente actualizado a \n"
									+ new_nom;
						}

						if (campo == 1) {

							lormTcp_persona.setPers_rut(new_nom);
							lormTcp_personaDAO.save(lormTcp_persona);
							message = "El rut \n"
									+ nombre_o_rut
									+ "\n ha sido correctamente actualizado a \n"
									+ new_nom;
						}

						if (campo == 2) {

							char veri = new_nom.charAt(0);

							lormTcp_persona.setPers_dverificador(veri+"");
							lormTcp_personaDAO.save(lormTcp_persona);
							message = "El d�gito verificador del rut \n"
									+ nombre_o_rut
									+ "\n ha sido correctamente actualizado a \n"
									+ new_nom;
						}

						if (campo == 3) {

							lormTcp_persona.setPers_sexo(new_nom);
							lormTcp_personaDAO.save(lormTcp_persona);
							message = "El sexo del rut \n"
									+ nombre_o_rut
									+ "\n ha sido correctamente actualizado a \n"
									+ new_nom;
						}
					}
					// si no encuentra registros ni por nombre ni por rut,
					// desplega el siguiente mensaje.
					if (length == 0 && length2 == 0) {

						message = "No se encontraron registros para el nombre ni rut";
					}

				}

				t.commit();
			} catch (PersistentException e1) {
				// t.rollback();
				message = "error";
				e1.printStackTrace();
			}
		}
		return message;
	}// fin método update

	/**
	 * Metodo que busca todos los registros de personas, si se ingresa un filtro
	 * busca segun este (nombre, rut, id)
	 * 
	 * @param buscar
	 *            , parametro que filtra la busqueda segun nombre, rut o id.
	 * @return
	 */
	
	public static Collection<PersonaSOAPVO> findall(String buscar) {
		String json = null;
		int length2 = 0;
		int length3 = 0;
		orm.tallerdesoa.DAOFactory lDAOFactory = orm.tallerdesoa.DAOFactory.getDAOFactory();
		// Collection<orm.Persona> ormPersonas =
		// Arrays.asList(lDAOFactory.getPersonaDAO().listPersonaByQuery(null,
		// null));
		Collection<PersonaSOAPVO> colecionPersonaSOAPVO = new ArrayList<PersonaSOAPVO>();

		orm.tallerdesoa.Tcp_persona[] ormPersonas;
		try {
			if ((buscar == null) || (buscar.equals(""))) {// si no se ingresa
															// ningun filtro por
															// el cual buscar

				ormPersonas = lDAOFactory.getTcp_personaDAO()
						.listTcp_personaByQuery(null, null);
				// busqueda de todos los registros existentes

			}

			else {// si se ingresa un filtro por el cual buscar

				ormPersonas = lDAOFactory.getTcp_personaDAO()
						.listTcp_personaByQuery("pers_rut='" + buscar + "'",
								null);
				// primera busqueda por defecto, segun el rut
				length2 = ormPersonas.length;

				if (length2 == 0) {// si no se encuentran datos coincidentes con
									// el rut

					ormPersonas = lDAOFactory.getTcp_personaDAO()
							.listTcp_personaByQuery(
									"pers_nombre='" + buscar + "'", null);
					// segunda busqeuda por nombre
					length3 = ormPersonas.length;
				}

				if (length2 == 0 && length3 == 0) {// si no se han encontrado
													// coincidencias ni por
													// nombre ni por rut

					ormPersonas = lDAOFactory.getTcp_personaDAO()
							.listTcp_personaByQuery("pers_id='" + buscar + "'",
									null);
					// tercera busqueda por identidad
				}

			}// fin busqueda segun filtro

			int length = ormPersonas.length;

			if (length == 0) {// si no se encontraron registros

				json = "No se ha encontrado ningun registro";
			}

			else {// si se encontraron registros

				for (int i = 0; i < length; i++) {
					System.out.println(ormPersonas[i].getPers_nombre());
					PersonaSOAPVO objeto = PersonaSOAPVO
							.crearPersonaSOAPVO(ormPersonas[i]);
					colecionPersonaSOAPVO.add(objeto);

				}// fin guardando resultados

				return colecionPersonaSOAPVO;
			}
		} catch (PersistentException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		return null;

	}

}
